package Day18_网络编程.demo5_优化上传;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * @Author：pengzhilin
 * @Date: 2020/5/10 14:15
 */
public class Client {
    public static void main(String[] args) throws Exception{
        // 1.创建Socket对象,指定要连接的服务器的ip地址和端口号
        Socket socket = new Socket("localhost",7777);

        // 2.创建字节输入流对象,关联数据源文件路径
        FileInputStream fis = new FileInputStream("Demo02\\aa\\hb.jpg");

        // 3.通过Socket对象获得输出流对象,关联连接通道
        OutputStream os = socket.getOutputStream();

        // 4.定义一个字节数组,用来存储读取到的文件字节数据
        byte[] bys = new byte[8192];
        // 5.定义一个变量,用来存储读取到的字节个数
        int len;
        // 6.循环读取
        while ((len = fis.read(bys)) != -1) {
            // 7.在循环中,写出数据
            os.write(bys,0,len);
        }
        // 原因:文件上传时,客户端已经把要上传的文件的字节数据已经都
        // 写到了连接通道中,但是服务器不知道,
        // 所以服务器会一直等待读取客户端写过来的数据
        // 解决办法: 客户端当不再写数据到连接通道中,应该告诉服务器不再写数据了
        // 解决办法: 使用Socket对象调用shutdownOutput()告诉服务器不再写数据了
        socket.shutdownOutput();

        // --------------客户端写完了所有数据之后,接受服务器回写的数据-----------------
        // 8.通过Socket对象获得字节输入流对象,关联连接通道
        InputStream is = socket.getInputStream();

        // 9.读取服务器回写的字符串数据,打印输出
        System.out.println("客户端正在等待服务器回写的数据..........");
        len = is.read(bys);// 客户端在等待读取服务器回写的数据
        System.out.println(new String(bys,0,len));

        // 10.关闭资源
        fis.close();
        socket.close();
    }
}
